package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKProxyTests {
    public static void main(String[] args) {
        //        目标对象 NoticeServiceImpl
        NoticeService noticeService = new NoticeServiceImpl() ;
    //        基于JDK方式为目标对象创建一个代理对象
        //        创建代理对象
//        获取ClassLoader
        ClassLoader classLoader = noticeService.getClass().getClassLoader();
//        获取目标对象实现的接口
        Class<?>[] interfaces =noticeService.getClass().getInterfaces();
//        创建InvocationHandler（为代理对象处理业务的对象）new接口时叫做匿名内部类  左边为接口 右边为实现类
            class ProxyHandler implements InvocationHandler{
                private Object targetObj;
                public ProxyHandler(Object targetObj){
                    this.targetObj=targetObj;
                }

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //System.out.println(proxy.getClass().getName());//com.sun.proxy.$Proxy0
                //System.out.println(method);//public abstract int proxy.NoticeService.deleteById(java.lang.Long[])
                //                Long[] array = (Long[]) args[0];
                //                System.out.println(array[0]+","+array[1]);

//                在此方法中如何调用目标方法(反射)：目标对象，方法，参数
                Object result = method.invoke(noticeService, args);
                return result;
            }
        };

        NoticeService proxy = (NoticeService) Proxy.newProxyInstance(
                classLoader,//类加载器（负责底层产生的代理类型）
                interfaces,//代理类要实现的接口（和目标一样的接口）
                new ProxyHandler(noticeService));//(代理类的处理器)
//        System.out.println(proxy.getClass().getName());
//        调用代理对象的方法，底层会调用handler对象的invoke方法
        proxy.deleteById(10L,20L);//[10L,20L]
    }
}
//Controller-Service接口-Proxy-InvocationHandler-ServiceImpl-Dao
//Jdk代理最主要的是实现接口